package mainCNN;

import java.util.ArrayList;

import util.Constantes;
import util.PadraoTreinamento;
import util.Util;

public class RecursiveCNN {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ArrayList<PadraoTreinamento> arrayRecursivoFinal = new ArrayList<PadraoTreinamento>();
		RecursiveCNN rCNN = new RecursiveCNN(); 
		
		String nomeDiretorio = "iris\\";
		String nomeSufixo = "IRIS";
		String nomeArquivoTreino = "IRS";
		
		for (int i = 0; i < 10; i++) {
			ArrayList<PadraoTreinamento> padroesTreinamento = Util.getTrainingData(Constantes.GET_NM_PATH_DATASET + nomeDiretorio + nomeSufixo + "_" + i);
			arrayRecursivoFinal = rCNN.recursive(padroesTreinamento, padroesTreinamento.size()/2);
			
			System.out.println(nomeSufixo + "_" + i);
			System.out.println("Tamanho original/final: ["+padroesTreinamento.size() + "/"+arrayRecursivoFinal.size()+"] = "+((double)arrayRecursivoFinal.size()/(double) (padroesTreinamento.size())));
			
			CNN condensedNearestNeighbour = new CNN(padroesTreinamento);
			ArrayList<PadraoTreinamento> arrayTeste = Util.getTrainingData(Constantes.GET_NM_PATH_DATASET + nomeDiretorio + nomeArquivoTreino + "_" +i);
			condensedNearestNeighbour.testar(arrayTeste, arrayRecursivoFinal);
		}
	}
	
	/**
	 * 
	 * @param pArrayPadraoOriginal
	 * @param pTamanhoMinimo
	 * @return
	 */
	public ArrayList<PadraoTreinamento> recursive(ArrayList<PadraoTreinamento> pArrayPadraoOriginal, int pTamanhoMinimo) {
		return this.recursive(pArrayPadraoOriginal, pTamanhoMinimo, 1);
	}
	
	/**
	 * 
	 * @param pArrayPadraoOriginal
	 * @param pTamanhoMinimo
	 * @param pJ
	 * @return
	 */
	public ArrayList<PadraoTreinamento> recursive(ArrayList<PadraoTreinamento> pArrayPadraoOriginal, int pTamanhoMinimo, int pJ) {
		
		if (pArrayPadraoOriginal.size() <= pTamanhoMinimo) {
			CNN cnn = new CNN(pArrayPadraoOriginal);
			return cnn.executar();
		} else {
			
			int tamanho = pArrayPadraoOriginal.size();
			int[] pos = new int[4];
			
			pos[0] = 0;
			pos[1] = tamanho/4;
			pos[2] = tamanho/2;
			pos[3] = (tamanho/4) * 3;
			
			ArrayList<PadraoTreinamento> tempSet = recursive(new ArrayList<PadraoTreinamento>(pArrayPadraoOriginal.subList(0, pos[1]-1)), pTamanhoMinimo);
			ArrayList<PadraoTreinamento> tempSet2 = recursive(new ArrayList<PadraoTreinamento>(pArrayPadraoOriginal.subList(pos[1], pos[2]-1)), pTamanhoMinimo);
			ArrayList<PadraoTreinamento> tempSet3 = recursive(new ArrayList<PadraoTreinamento>(pArrayPadraoOriginal.subList(pos[2], pos[3]-1)), pTamanhoMinimo);
			ArrayList<PadraoTreinamento> tempSet4 = recursive(new ArrayList<PadraoTreinamento>(pArrayPadraoOriginal.subList(pos[3], tamanho-1)), pTamanhoMinimo);
			
			tempSet.addAll(tempSet2);
			tempSet.addAll(tempSet3);
			tempSet.addAll(tempSet4);
			
			/*
			int primeiraMetade = (pArrayPadraoOriginal.size()/2) -1;
			int segundaMetade = pArrayPadraoOriginal.size()/2;
			
			ArrayList<PadraoTreinamento> tempSet = recursive(new ArrayList<PadraoTreinamento>(pArrayPadraoOriginal.subList(0, primeiraMetade)), pTamanhoMinimo);
			ArrayList<PadraoTreinamento> tempSet2 = recursive(new ArrayList<PadraoTreinamento>(pArrayPadraoOriginal.subList(segundaMetade, pArrayPadraoOriginal.size()-1)), pTamanhoMinimo);
			
			tempSet.addAll(tempSet2);
			*/
			return recursive(tempSet, pTamanhoMinimo);	
		}
	}
}
